home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / compuserve-file-archive / 11 Exotic Applications / MAKETP.ZIP / MAKETAPE.C next >
Encoding:
C/C++ Source or Header  |  1993-09-01  |  2.6 KB  |  140 lines

  1. /*
  2.   T64 TapeMaker
  3.   Creates a T64 file and imports C64 files
  4.   T64 is a standard C64S tape image
  5.   C64 file must be in standard PRG format:
  6.     2 bytes start address, the other bytes file contents
  7. */
  8.  
  9. #include <io.h>
  10. #include <dos.h>
  11. #include <string.h>
  12. #include <fcntl.h>
  13.  
  14. #define  NEWSIZE  30
  15. #define  BUFSIZE  16384
  16.  
  17. typedef struct
  18. {
  19.   char
  20.     text [32];
  21.   int
  22.     version, entries, used, xxx;
  23.   char
  24.     name [24];
  25. }
  26.   HEADER;
  27.  
  28. typedef struct
  29. {
  30.   unsigned char
  31.     etype, ctype;
  32.   unsigned int
  33.     start, end, xxx1;
  34.   unsigned long
  35.     fpos, xxx2;
  36.   char
  37.     name [16];
  38. }
  39.   ENTRY;
  40.  
  41. char
  42.     buffer [BUFSIZE];
  43.  
  44. void main( int argc, char **argv )
  45. {
  46.   char
  47.         name [256];
  48.     HEADER
  49.         header =
  50.         {
  51.             "C64 tape image file",
  52.             0x100,
  53.             NEWSIZE,
  54.             0, 0,
  55.             "IMPORTED FILES          "
  56.         };
  57.     ENTRY
  58.         entry =
  59.         {
  60.             0, 0,
  61.             0, 0, 0,
  62.             0, 0,
  63.             ""
  64.         };
  65.     int
  66.         t, f, n, nf, r;
  67.     unsigned long
  68.         pos;
  69.  
  70.   if( argc == 1 )
  71.   {
  72.         printf( "Usage: MAKETAPE t64name [file1 [file2 ...]]\n" );
  73.         return;
  74.   }
  75.   strcpy( name, argv[1] );
  76.     strcat( name, ".T64" );
  77.     if( (t = _open( name, O_RDWR )) < 0 )
  78.     {
  79.         if( (t = _creat( name, FA_ARCH )) < 0 )
  80.         {
  81.             printf( "Can't create file: %s\n", name );
  82.             return;
  83.         }
  84.         printf( "Creating file: %s\n", name );
  85.         _write( t, &header, sizeof( header ));
  86.         for( n = nf = 0; n < NEWSIZE; n++ )
  87.             _write( t, &entry, sizeof( entry ));
  88.     }
  89.     else
  90.     {
  91.         printf( "Openning file: %s\n", name );
  92.         _read( t, &header, sizeof( header ));
  93.         _read( t, &entry, sizeof( entry ));
  94.         for( n = 0; entry.etype != 0 && n < header.entries; n++ )
  95.         {
  96.             _read( t, &entry, sizeof( entry ));
  97.         }
  98.         nf = n;
  99.     }
  100.     for( n = 2; n < argc && nf < header.entries; n++ )
  101.     {
  102.         if( (f = _open( argv[n], O_RDONLY )) < 0 )
  103.         {
  104.             printf( "Can't open: %s\n", argv[n] );
  105.         }
  106.         else
  107.         {
  108.             printf( "Importing file: %s\n", argv[n] );
  109.             _read( f, &entry.start, 2 );
  110.             entry.end = entry.start;
  111.             entry.etype = 1;
  112.             entry.ctype = 1;
  113.             entry.fpos = filelength( t );
  114.             lseek( t, entry.fpos, SEEK_SET );
  115.             for( r = _read( f, buffer, BUFSIZE ); r > 0;
  116.                 r = _read( f, buffer, BUFSIZE ))
  117.             {
  118.                 _write( t, buffer, r );
  119.                 entry.end += r;
  120.             }
  121.             _close( f );
  122.             strcpy( name, argv[n] );
  123.             strupr( name );
  124.             strcat( name, "                " );
  125.             strncpy( entry.name, name, 16 );
  126.             lseek( t, sizeof( header ) + nf * sizeof( entry ), SEEK_SET );
  127.             _write( t, &entry, sizeof( entry ));
  128.             nf++;
  129.         }
  130.     }
  131.     header.used = nf;
  132.     lseek( t, 0, SEEK_SET );
  133.     _write( t, &header, sizeof( header ));
  134.     _close( t );
  135.     printf( "O.K.\n" );
  136. }
  137.  
  138.  
  139.  
  140.